{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Creating Matches\n",
    "----------------\n",
    "\n",
    "One of the capabilities of the library is to create a match between two strategies. Strategies are implemented in\n",
    "the library as `classes`. A list of all the implemented strategies in the library can be found here: http://axelrod.readthedocs.io/en/latest/reference/all_strategies.html\n",
    "\n",
    "For now we are going to use two simple strategies to demonstrate how we create a `match`.\n",
    "A match is often useful when designing new strategies in order to study how they perform against specific opponents."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So for example let us create a 5 turns match between `Cooperator` and `Random`. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`Cooperator` is a strategy designed to cooperate and each turn, and `Random` is a strategy that cooperates at teach turn with a probability of `0.5`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import axelrod as axl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'4.3.0'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "axl.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(C, D), (C, D), (C, C), (C, C), (C, D)]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "axl.seed(0)\n",
    "players = (axl.Cooperator(), axl.Random())\n",
    "match = axl.Match(players, turns=5)\n",
    "results = match.play()\n",
    "results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The first elemeent of each tuple is the action made by `Cooperator` and the second one by `Random`. Indeed we can see that `Cooperator` played C for all five turns.\n",
    "\n",
    "`Random` is a stochastic strategy and its actions depend on a probability. We can see that the strategy cooperated only on the third and fourth turn.\n",
    "\n",
    "The match between the two strategies is being seeded. That is because of the line `axl.seed(0)`. This means that no matter how many times you run the above match the results will remain the same."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`Random` is a stochastic strategy and thus the actions of the strategy can be different even for the same opponent! We can see this by running a match with a different seed."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(C, C), (C, D), (C, D), (C, C), (C, C)]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "axl.seed(1)\n",
    "players = (axl.Cooperator(), axl.Random())\n",
    "match = axl.Match(players, turns=5)\n",
    "results = match.play()\n",
    "results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now `Random` also cooperated on the first turn. Try and change the seed and see other behaviours of the strategy."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are several measures that can be obtained from a match. Let us consider the match between the strategies for `axl.seed(0)`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "axl.seed(0)\n",
    "players = (axl.Cooperator(), axl.Random())\n",
    "match = axl.Match(players, turns=5)\n",
    "results = match.play()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can view the scores each strategy received at each turn. The first element of the tuples correspond to `Cooperator`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(0, 5), (0, 5), (3, 3), (3, 3), (0, 5)]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scores = match.scores()\n",
    "scores"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that these scores correspond to the Prisoner's Dilemma (PD) payoffs as presented in [An introduction to game theory and the Iterated Prisoner's Dilemma](1.%20Introduction.ipynb). Thus, in each turn of the match the strategies play a PD game."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Axelrod game: (R,P,S,T) = (3, 1, 0, 5)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "axl.game.Game()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The PD is set as the default game in the library. However, it is possible to use a different game.\n",
    "More information can be found on the online documentation of the Axelrod project, and specifically at [Using and playing different stage games](https://axelrod.readthedocs.io/en/stable/tutorials/advanced/games.html)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The final scores of a match, which are the sum of the scores per turn."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(6, 21)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "match.final_score()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The average score achieved per turn."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1.2, 4.2)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "match.final_score_per_turn()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The winner."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Random: 0.5"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "match.winner()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The number of cooperations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5, 2)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "match.cooperation()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The normalised number of cooperations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1.0, 0.4)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "match.normalised_cooperation() "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "EXERCISE\n",
    "--------\n",
    "Use the `Match` class to create the following matches:\n",
    "    \n",
    "- 5 turns match Cooperator vs Defector \n",
    "- 10 turns match Tit For Tat vs Grumpy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Creating Tournaments\n",
    "-----------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Remember the library was created to study the interactions between strategies in a round robin tournament. A tournament where each strategy plays against all opponents. The strategy with the highest score is the winner of the tournament. Here we will cover how we can easily create a very simple IPD tournament."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here we create a list of players. \n",
    "\n",
    "\n",
    "**Reminder:** The full list of all the implemented strategies can be found [here](http://axelrod.readthedocs.io/en/latest/reference/all_strategies.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "players = [axl.Cooperator(), axl.Defector(), axl.Random(),\n",
    "           axl.TitForTat(), axl.Grumpy(), axl.Alternator()]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now create a tournament, play it, save the results and view the rank of each player:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "200"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tournament = axl.Tournament(players=players)\n",
    "tournament.turns # default value of turns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tournament.repetitions # default value of repetitions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "tags": [
     "nbval-ignore-output"
    ]
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Playing matches: 100%|██████████| 21/21 [00:00<00:00, 32.90it/s]\n",
      "Analysing: 100%|██████████| 25/25 [00:00<00:00, 121.02it/s]\n"
     ]
    }
   ],
   "source": [
    "axl.seed(1)\n",
    "results = tournament.play()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Similar to the matches the tournaments include several result measures. For example the strategies ranked by their average score per turn."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "winners = results.ranked_names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Defector',\n",
       " 'Alternator',\n",
       " 'Random: 0.5',\n",
       " 'Tit For Tat',\n",
       " 'Grumpy: Nice, 10, -10',\n",
       " 'Cooperator']"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "winners"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The winner of the tournament is the strategies at index 0 which in our example is Defector."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Defector'"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "winners[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The scores achieved by each strategy at each repetition."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[1803, 1812, 1752, 1791, 1761, 1800, 1791, 1788, 1821, 1812],\n",
       " [2668, 2612, 2680, 2608, 2612, 2672, 2656, 2668, 2628, 2660],\n",
       " [2616, 2589, 2070, 2606, 2409, 2119, 2605, 2137, 2300, 2218],\n",
       " [2360, 2353, 2352, 2346, 2355, 2364, 2353, 2339, 2346, 2368],\n",
       " [1989, 2013, 2208, 2001, 2056, 2174, 2007, 2167, 2112, 2172],\n",
       " [2638, 2661, 2655, 2647, 2692, 2671, 2655, 2672, 2635, 2643]]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scores = results.scores\n",
    "scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cooperator: [1803, 1812, 1752, 1791, 1761, 1800, 1791, 1788, 1821, 1812]\n",
      "========================================================================\n",
      "Defector: [2668, 2612, 2680, 2608, 2612, 2672, 2656, 2668, 2628, 2660]\n",
      "========================================================================\n",
      "Random: [2616, 2589, 2070, 2606, 2409, 2119, 2605, 2137, 2300, 2218]\n",
      "========================================================================\n",
      "Tit For Tat: [2360, 2353, 2352, 2346, 2355, 2364, 2353, 2339, 2346, 2368]\n",
      "========================================================================\n",
      "Grumpy: [1989, 2013, 2208, 2001, 2056, 2174, 2007, 2167, 2112, 2172]\n",
      "========================================================================\n",
      "Alternator: [2638, 2661, 2655, 2647, 2692, 2671, 2655, 2672, 2635, 2643]\n",
      "========================================================================\n"
     ]
    }
   ],
   "source": [
    "for i, player in enumerate(players):\n",
    "    print(f'{player.name}:', scores[i])\n",
    "    print(\"========================================================================\")\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also plot the results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "tags": [
     "nbval-ignore-output"
    ]
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "//anaconda3/envs/game-python/lib/python3.6/site-packages/ipykernel_launcher.py:4: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  after removing the cwd from sys.path.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot = axl.Plot(results)\n",
    "p = plot.boxplot()\n",
    "p.show();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The above plot shows several things.\n",
    "\n",
    "1. The ranks of the strategies. From left to right the strategies are ordered based on their performance. Defector is first and thus is the winner of the tournament. Cooperator is last and thus came last in the tournament.\n",
    "\n",
    "2. The distributions of the average score each strategy achieved. Random has the more variation in its distribution and thus the strategy has many different scores each time the tournament was repeated. As a reminder the tournament was repeated 10 times."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "EXERCISE\n",
    "--------\n",
    "\n",
    "Create your own tournament using any five players from the library and take a look at the ranked names and plot the scores."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Summary\n",
    "--------\n",
    "\n",
    "This section has discussed:\n",
    "\n",
    "- Creating a match\n",
    "- and creating various tournaments.\n",
    "\n",
    "In the next section we will send some time looking at implementing our own strategies."
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "game-python",
   "language": "python",
   "name": "game-python"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
